#ifndef ADAPI_H
#define ADAPI_H

#include "addatatype.h"
#include "admediacontext.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <QUrl>
#include <QDebug>


class ADApi
{

public:
    ADApi();
    ~ADApi();

    //获取服务器解析结果
    static QByteArray GetBytes(const QString &sentence,const QString &filter_type="", const QString &filter_attr="", const QString &url="http://120.76.205.173:8091/chat");

    //反序列化
    static QList<ADDataType> DeseriesBytes(const QByteArray &bytes);

    //注册单个设备，单个属性
    static void MediaRegistry(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //注册单个设备，多个属性
    static void MediasRegistry(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attrs, int floor, const QString &area);

    //注册场景
    static void ScenesRegistry(int media_id, int proj_id, const QString &scenes, int floor, const QString &area);

    //清空所有注册设备
    static void ClearAllMedias();

    //清空单个设备
    static void ClearMedia(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //获取注册设备
    static QList<SimpleInfo> GetAllRegistriedMedias(const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //单个筛选 status :1.解析失败,3 指定设备名但未匹配上返回所有同类设备, 4未定名称匹配 + 非场景匹配结果, 5.未定名称匹配 + 场景匹配结果, 6.名称确定匹配结果, 数字高则优先级高
    static QList<ADDataType> FilterCommandS(const ADDataType &data, int &status);

    //筛选结果
    static QList<ADDataType> FilterCommandS(QList<ADDataType> &datas, int &prior, int floor=-10000, QString area="");

    //status: 0.无疑问结果, 1.网络错误, 2.解析失败, 3未有合适项, 4.场景匹配结果， 5.未指定设备名结果, 6.指定设备名但未匹配上返回所有同类设备
    static QList<ADDataType> ParseAttention(const QString &sentence, int &status, int floor=-10000, const QString &area="", const QString &url="http://120.76.205.173:8091/chat", const QString &filter_type="", const QString &filter_attr="");

    //status: 0.无疑问结果, 2.解析失败, 3未有合适项, 4.场景匹配结果， 5.未指定设备名结果, 6.指定设备名但未匹配上返回所有同类设备
    static QList<ADDataType> ParseAttention(const QByteArray &bytes, int &status, int floor=-10000, const QString &area="");


public: //支持多实例
    //注册单个设备，单个属性
    void MutiMediaRegistry(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //注册单个设备，多个属性
    void MutiMediasRegistry(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attrs, int floor, const QString &area);

    //注册场景
    void MutiSceneRegistry(int media_id, int proj_id, const QString &scenes, int floor, const QString &area);

    //清空所有注册设备
    void MutiClearAllMedias();

    //清空单个设备
    void MutiClearMedia(int media_id, int proj_id, const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //获取注册设备
    QList<SimpleInfo> MutiGetAllRegistriedMedias(const QString &media_cn, const QString &media_name, const QString &attr, int floor, const QString &area);

    //单个筛选 status :1.解析失败, 4未定名称匹配 + 非场景匹配结果, 5.未定名称匹配 + 场景匹配结果, 6.名称确定匹配结果, 数字高则优先级高
    QList<ADDataType> MutiFilterCommandS(const ADDataType &data, int &status);

    //筛选结果
    QList<ADDataType> MutiFilterCommandS(QList<ADDataType> &datas, int &prior, int floor=-10000, QString area="");

    //status: 0.无疑问结果, 1.网络错误, 2.解析失败, 3未有合适项, 4.场景匹配结果， 5.未指定设备名结果
    QList<ADDataType> MutiParseAttention(const QString &sentence, int &status, int floor=-10000, const QString &area="", const QString &url="http://120.76.205.173:8091/chat", const QString &filter_type="", const QString &filter_attr="");


private:
    AdMediaContext* _instance;

};

#endif // ADAPI_H
